#ifndef __ZEUS_S3_DRIVER_H__
#define __ZEUS_S3_DRIVER_H__

#include <ros/ros.h>

#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <sys/times.h>
#include <sys/types.h>
#include <termios.h>
#include <unistd.h>
#include <sys/ioctl.h>

#include <serial/serial.h> 
#include <sensor_msgs/BatteryState.h>
#include <sensor_msgs/JointState.h>
#include <std_msgs/UInt8.h>
#include <geometry_msgs/Twist.h>

/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
#define APP_NULL            0u
#define APP_F_NULL          0.0f

#define APP_FALSE           0u
#define APP_TRUE            0xff

#define TXD_MAX             26
#define RXD_MAX             26
#define EXT_DATA_WIDTH      2

#define JOINT_MAX           8

//===============================
// 数据头
#define EXT_PTCL_H_S      	0
#define EXT_PTCL_CMD        1
#define EXT_PTCL_IDX        2
#define EXT_PTCL_STE        3
// 帧数据
#define EXT_PTCL_xPTR       4
// 校验和
#define EXT_PTCL_C_S        24
//===============================

#define EXT_PTCL_DATA_MAX   10

#define EXT_DTX_1           0
#define EXT_DTX_2           1
#define EXT_DTX_3           2
#define EXT_DTX_4           3
#define EXT_DTX_5           4
#define EXT_DTX_6           5
#define EXT_DTX_7           6
#define EXT_DTX_8           7
#define EXT_DTX_9           8
#define EXT_DTX_10          9
#define EXT_CHKS            10

#define EXT_FRAME_HEADER    '$'

#define MAX_BATTERY_VOLTAGE		54.6f
#define MIN_BATTERY_VOLTAGE		37.0f

#define ROTATION 			48.0f//48.87f

#define WHEEL_BASE			0.5f	//轴距
#define WHEEL_TRACK			0.59f	//轮距
#define ACKMAN_ANG			1.18f	// 阿克曼公式 cotβ−cotα= WHEEL_TRACK/WHEEL_BASE

/* Exported types ------------------------------------------------------------*/
//=================================================================================================
//数据帧为定长26字节，前4个单字节为标识，一帧携带10个int16类型数据(20字节)，校验和2字节
//-------------------------------------------------------------------------------------------------
typedef struct{                                                                 // 定长通信帧(26字节)
  uint8_t h_s;                                                                  // 帧头
  uint8_t cmd;                                                                  // 命令
  uint8_t idx;                                                                  // 子命令
  uint8_t ste;                                                                  // 状态字
  uint32_t dtx[EXT_PTCL_DATA_MAX];                                              // 数据串(2字节存储int16类型)
  uint32_t c_s;                                                                 // 校验和
}net_ptcl_t;
//=================================================================================================

typedef enum{
  EXT_CMD_GET_BATTERY_INF = 0x01,                                               // 获取电源信息
  EXT_CMD_GET_SONAR_DATA = 0x02,                                                // 获取声纳数据
  EXT_CMD_GET_ROBOT_DATA = 0x03,											    // 获取机械臂数据
  EXT_CMD_SET_xSMART_ENB = 0x11,                                                // 设备使能配置
  EXT_CMD_SET_MOTOR_DATA = 0x12,                                                // 设置电机参数
  EXT_CMD_SET_SHUTDOWN = 0x13,										            // 关闭系统电源
  EXT_CMD_SET_STOP_KEY = 0x14,										            // 急停开关控制
  EXT_CMD_SET_ROBOT_DATA = 0x15,									            // 设置机械臂参数
}ext_cmd_t;

typedef enum{
  ENB_SET_MOTOR = 0x01,                                                         // 动力使能
  ENB_SET_ARM = 0x02,                                                           // 机械臂使能
  ENB_SET_USR = 0x03,                                                           // 输出使能
}ext_enable_func_t;

typedef enum{
  MOTOR_TORQUE = 0x01,                                                    		// 设置电机力矩数据
  MOTOR_VELOCITY = 0x02,                                                  		// 设置电机速度数据
  MOTOR_POSITION = 0x03,                                                  		// 设置电机位置数据
  MOTOR_MIXED_4X4 = 0x04,												        // 设置四动力数据四位置数据
}ext_motor_func_t;

typedef enum{
  ROBOT_TORQUE = 0x01,                                                    		// 设置机械臂关节力矩数据
  ROBOT_VELOCITY = 0x02,                                                  		// 设置机械臂关节速度数据
  ROBOT_POSITION = 0x03,                                                  		// 设置机械臂关节位置数据
  ROBOT_BRAKE = 0x04,													        // 设置机械臂抱闸
  ROBOT_G_FD = 0x05,													        // 设置机械臂重力前馈
  ROBOT_F_STEP = 0x06,												            // 设置机械臂单次最大步进因子
}ext_robot_func_t;

typedef enum{
  SYS_FLAG_INIT = 0x00,                                                         // 系统初始化
  SYS_FLAG_STARTUP = 0x01,                                                      // 系统启动
  SYS_FLAG_IDLE = 0x02,                                                         // 系统空闲
  SYS_FLAG_PLAY = 0x03,                                                         // 系统运行
  SYS_FLAG_STOP = 0x04,                                                         // 系统停止
  SYS_FLAG_TRUNOFF = 0x05,                                                      // 系统关闭
}sys_flag_t;

typedef enum{
  SYS_STE_NO_ERR = 0x00,													    // 系统无错误

  SYS_STE_VOLTAGE_LOW = 0x01,												    // 电池电压低
  SYS_STE_VOLTAGE_HIGH = 0x02,											        // 电池电压高
	
  SYS_STE_STOP_1_KEY_PD	= 0x03,											        // 急停一被按下
  SYS_STE_STOP_2_KEY_PD	= 0x04,										            // 急停二被按下
	
  SYS_STE_MOTOR_1_ERR = 0x10,											        // 电机一故障
  SYS_STE_MOTOR_2_ERR = 0x11,										            // 电机二故障
  SYS_STE_MOTOR_3_ERR = 0x12,											        // 电机三故障
  SYS_STE_MOTOR_4_ERR = 0x13,										            // 电机四故障
  SYS_STE_MOTOR_5_ERR = 0x14,												    // 电机五故障
  SYS_STE_MOTOR_6_ERR = 0x15,											        // 电机六故障
  SYS_STE_MOTOR_7_ERR = 0x16,											        // 电机七故障
  SYS_STE_MOTOR_8_ERR = 0x17,											        // 电机八故障

}sys_state_t;

typedef struct{
  float fPrePOS;                                                         	    // 预设角度
  float fPreSPD;                                                         	    // 预设速度
  float fPreTOR;                                                           		// 预设力矩
	
  float fActPOS;                                                         	    // 实际角度
  float fActSPD;                                                         	    // 实际速度
  float fActTOR;                                                           		// 实际力矩
}motor_t;


/* Exported functions ------------------------------------------------------- */

#endif //__ZEUS_S3_DRIVER_H__
